<?php
/**
 *
 * MYSQL相关库
 * @author wangtao
 * @version 1.0
 */
if (!defined('IN_WT')) {
	die('么么哒，亲们一定要幸福哦！'); //Hacking attempt
}
class db_expr {}

class mysqlDB
{
	public $querynum = 0;			//查询的次数
	public $queryTime = '';			//查询所用的时间
	private static $link = null;	//返回的值
	private $connection;
	public $host;
	public $user;
	public $passw;
	public $db;
	
	/**
	 * 构造函数，连接数据库
	 * @param string $DBhost	数据库主机
	 * @param string $DBuser	数据库用户
	 * @param string $DBpassw   数据库密码
	 * @param string $DBname	数据库名
	 * @param string $char		数据库字符
	 */
	private function __construct($DBhost, $DBuser, $DBpassw, $DBname, $char)
	{
		$con = mysql_connect($DBhost, $DBuser, $DBpassw) or die('不能连接到数据库：' . mysql_error());
		$this->connection = $con;
		mysql_select_db($DBname, $this->connection) or die('不能选择' . $DBname . '数据库。' .  mysql_error($this->connection));
		mysql_query('SET NAMES \'' . $char . '\'', $this->connection);
		return $con;
	}

	public function __destruct()
	{
		#mysql_close($this->connection);
	}
	
	/**
	 * 数据库连接对外接口
	 */
	public static function con()
	{
		if (self::$link == null) {
			$link = new mysqlDB(DBHOST, DBUSER, DBPASSW, DBNAME, DBCHAR);
			self::$link = $link;
		}
		else {
			$link = self::$link;
		}
		return $link;
	}
	
	public function assoc($result)
	{
		return mysql_fetch_assoc($result);
	}

	/**
	 * 发送一条MYSQL查询
	 * @access public
	 * @param string $sql		执行的SQL语句
	 * @param string $type		查询的类型
	 * @return resource
	 */
	public function query($sql, $type = '')
	{
		$link = $this->connection;
		switch ($type)
		{
			case 'u' :
				$this->querynum ++;
				if ($this->queryTime == '')
				{
					$this->queryTime = microtime(true);
				}
				$result = mysql_unbuffered_query($sql) or errorpage::e();
				return $result;
			default:
				$this->querynum ++;
				if ($this->queryTime == '')
				{
					$this->queryTime = microtime(true);
				}
				$result = mysql_query($sql, $link) or $mysqlError = mysql_error();
				return $result;
		}
	}
	
	/**
	 * 插入数据
	 * @access public
	 * @param string $table				表名
	 * @param array $vo					数据
	 * @param bool $replace				是否为
	 */
	public function insert($table, $vo, $replace = false)
	{
		$values = array();
		$columns = array();
		foreach ($vo as $column => $value)
		{
			if (!isset($value))
			{
				continue;
			}
			$columns[] = '`' . $column . '`';
			if (!$value instanceof db_expr)
			{
				$values[] = '\'' . $value . '\'';
			}
			else
			{
				$values[] = $value;
			}
		}
		$sql = sprintf('%s INTO `%s` (%s) VALUES (%s)', $replace ? 'REPLACE' :'INSERT', $table, implode(',', $columns), implode(',', $values));
		$this->query($sql);
	}
	
	/**
	 * 查询指定表里指定字段
	 * @access public
	 * @param string $table		表名
	 * @param string $field		字段名
	 * @return array
	 */
	public function selectOneField($table, $field)
	{
		$sql = 'SELECT `' . $field . '` FROM `' . $table . '`';
		$array = $this->fetch($sql);
		return $array;
	}
	
	/**
	 * 查询指定表里指定多个字段
	 * @access public
	 * @param string $table		表名
	 * @param array	 $array		字段名
	 * @return array
	 */
	public function selectField($table, $array)
	{
		$field = implode('` , `', $array);
		$sql = 'SELECT `' . $field . '` FROM `' . $table . '`';
		$array = $this->fetch($sql);
		return $array;
	}
    /*
     * 返回指定行
     * $sql：SQL语句
     * $start：开始的条数
     * $num：返回的条数
     */
    public function selectLimit($sql, $num = 10, $start = 0)
    {
    	if($start == 0)
    	{
    		$sql .= ' LIMIT ' . $num;
    	}
    	else
    	{
    		$sql .= ' LIMIT ' . $start . ', ' . $num;
    	}
    	return $this->fetch($sql);
    }
	
	/**
	 * 执行查询语句，返回一个包含所以资料的数组
	 * @access public
	 * @param string $sql		所查询的语句
	 * @return array
	 */
	public function fetch($sql)
	{
		$array = array();
		$result = $this->query($sql);
		while (($row = mysql_fetch_array($result)) || $row)
		{
			$array[] = $row;
		}
		return $array;
	}
	
	/**
	 * 执行查询语句，返回一个包含所有资料的关联数组。
	 * @param unknown_type $sql
	 */
	public function fetchAssoc($sql)
	{
		$array = array();
		$result = $this->query($sql);
		while (($row = $this->assoc($result)) || $row)
		{
			$array[] = $row;
		}
		return $array;
	}
	
    /*
     * 返回一个数组
     */
    public function getOneArr($sql)
    {
    	$result = $this->query($sql);
        if ($result !== false)
        {
            $arr = array();
            while (($row = mysql_fetch_row($result)) || $row)
            {
                $arr[] = $row[0];
            }

            return $arr;
        }
        else
        {
            return false;
        }
    }
    
	function getRow($sql)
    {
        $result = $this->query($sql);
        return mysql_fetch_assoc($result);
    }
    
	/**
	 * 返回查询一行的值，没有返回false
	 * @param string $sql
	 */
	public function fetch1line($sql)
	{
		$result = $this->query($sql);
		if($result)
		{
			$arr = mysql_fetch_assoc($result);
			return $arr;	
		}
		else
		{
			return false;
		}
	}
	/**
	 * 执行查询语句，返回第一个值
	 * @param string $sql	所查询的语句
	 * @return string
	 */
	public function query2one($sql)
	{
		$array = $this->fetch($sql);
		if (empty($array))
		{
			return false;
		}
		else
		{
			return $array[0][0];
		}		
	}
	
	/**
	 * 返回查询行数
	 * @param resource $query	一个查询指针
	 * @return int
	 */
	public function rowNum($query)
	{
		return mysql_num_rows($query);
	}
	
	/**
	 * 返回查询行数
	 * @param string $sql	查询的数据
	 * @return int
	 */
	public function SQLnum($sql)
	{
		$result = $this->query($sql);
		return mysql_num_rows($result);
	}
	
	/**
	 * 返回查询的字段数
	 * @param resource $query	一个查询指针
	 * @return int
	 */
	public function fieldsNum($query)
	{
		return mysql_num_fields($query);
	}
	
	/**
	 * 查询在数据库里有多少数据
	 * @param string $table			表名
	 * @param string $field			列名
	 */
	public function queryCount($table, $field = '*')
	{
		$sql = 'SELECT count( ' . $field . ' ) FROM `' . $table . '`';
		$count = $this->query2one($sql);
		return $count;
	}
	/**
	 * 获得SELECT查询影响行数,可以用于统计查询返回值的个数
	 * @param string $sql	SQL语句
	 * @return int
	 */
	public function queryNum($sql)
	{
		$result = $this->query($sql);
		if($result)
		{
			return $num_rows = mysql_num_rows($result);
		}
		else
		{
			return $num_rows = 0;
		}
	}

	/**
	 * 查询返回的错误信息
	 * @param string $message	错误信息
	 * @param string $sql		SQL语句
	 * @return void
	 */
	public function errorMSG($message = '', $sql = '')
	{
		$error = '';
		if ($message)
		{
			$error = 'MYSQL 错误：<p>' . $message . '</p>';
		}
		if ($sql)
		{
			$error .= 'SQL:<p>' . $sql . '<p>'; 
		}
		if ($error)
		{
			echo $error;
		}
		exit;
	}
	
    /**
     * 返回表格大小
     * @param string $table  表格名
     * @return float
     */
    public function getTableLegth($table)
    {
    	$sql = 'SHOW TABLE STATUS LIKE \'' . $table . '\'';
    	$data = $this->Qobject($sql);
    	
    	$total = ($data->Data_length+$data->Index_length)/1048576;
    	return $total;
    }
    
	/**
     * 返回查询的对象
     * @param string $sql	所执行的语句
     */
    public function Qobject($sql)
    {
    	$result = $this->query($sql);
		return mysql_fetch_object($result);
    }
}

/**
 * MYSQL查询类
 * @author wangtao
 *
 */
class mysqlSE extends mysqlDB
{
}